Scroll to navigation

OPEN(2) Wywołania systemowe OPEN(2)

NAZWA

open, creat - otwarcie i utworzenie pliku lub urządzenia

SKŁADNIA

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);

OPIS

Uwaga! To tłumaczenie może być nieaktualne!

Funkcja systemowa open służy do przekształcenia ścieżki na deskryptor pliku (małą, nieujemną liczbę całkowitą używaną w późniejszych operacjach we/wy, takich jak read, write, itd.). Jeśli wywołanie się powiedzie, to zwrócony deskryptor pliku będzie najmniejszym aktualnie nie otwartym deskryptorem pliku dla tego procesu. Funkcja ta tworzy nowy otwarty plik, nie współdzielony z żadnym innym procesem. (Ale współdzielone otwarte pliki mogą pochodzić z wywołania funkcji systemowej fork(2).) Nowt deskryptor pliku będzie przekazywany przez wywołania funkcji exec (zobacz fcntl(2)). Przesunięcie pliku jest ustawiane na jego początek.

Parametr flags to jedna z wartości: O_RDONLY, O_WRONLY lub O_RDWR, które stanowią, odpowiednio, żądania otwarcia tylko dla odczytu, tylko dla zapisu, lub dla odczytu i zapisu. Argument flags może być połączony bitowym OR z zerem lub więcej spośród następujących wartości:

Jeśli plik nie istnieje, to będzie utworzony. Właściciel (ID użytkownika) tego pliku jest ustawiany na efektywny ID użytkownika procesu. Grupa właściciela (ID grupy) jest ustawiana albo na efektywny ID grupy procesu. albo na ID grupy katalogu nadrzędnego (w zależności od rodzaju systemu plików, opcji montowania i atrybutów katalogu nadrzędnego, zobacz np. opcje montowania bsdgroups i sysvgroups dla systemu plików ext2 opisane w mount(8)).
Gdy zostanie użyte w połączeniu z O_CREAT, to jeśli plik już istnieje, open się nie powiedzie. W tym kontekście dowiązanie symboliczne jest istniejącym plikiem, niezależnie od tego, na co wskazuje. O_EXCL nie działa jak należy na systemach plików NFS. Programy, które nadmiernie ufają wykonywaniu przez open zadań blokowania, będą zawierać wyścig. Rozwiązanie dla wykonywania atomowych operacji blokowania plików za pomocą pliku-blokady polega na utworzeniu unikalnego pliku na tym samym systemie plików (np. wykorzystując nazwę hosta i PID) i użyciu link(2) do utworzenia dowiązania do pliku-blokady. Jeśli link() zwróci 0, to utworzenie blokady się powiodło. W przeciwnym razie, należy użyć stat(2) na unikalnym pliku, aby sprawdzić, czy ilość jego dowiązań wzrosła do 2. W takiej sytuacji utworzenie blokady również się powiodło.
Jeśli pathname odnosi się do urządzenia terminalowego — zobacz tty(4) — to nie stanie się terminalem sterującym procesu, nawet jeśli proces takiego nie ma.
Jeśli plik już istnieje, jest zwykłym plikiem i tryb otwarcia pozwala na zapis (tzn. jest to O_RDWR lub O_WRONLY), to plik ten zostanie obcięty do zerowej długości. Jeśli plik to FIFO lub urządzenie terminalowe, to znacznik O_TRUNC jest ignorowany. W pozostałych przypadkach efekt użycia znacznika O_TRUNC jest nieokreślony. (W wielu wersjach Linuksa zostanie zignorowany, w innych wersjach funkcja zwróci błąd.)
Plik jest otwierany w trybie dopisywania. Przed każdą operacją write, wskaźnik pliku jest ustawiany na koniec pliku, jak z lseek. O_APPEND może prowadzić do zepsucia plików na systemach plików NFS, gdy więcej niż jeden proces naraz dopisuje dane do pliku. Jest to związane z faktem, że NFS nie wspiera dopisywania do pliku, więc jądro klienta musi to zasymulować, co nie może zostać wykonane bez wyścigu.
Plik jest otwierany w trybie nieblokującym, o ile to możliwe. Ani open ani kolejne operacje na zwróconym przez to wywołanie deskryptorze nie spowodują blokowania procesu (zatrzymania w oczekiwaniu na dane, itp.). Szczegóły dotyczące obsługi FIFO (nazwanych potoków) można znaleźć w fifo(4). Ten tryb może nie mieć żadnego wpływu na pliki inne niż FIFO.
Plik jest otwierany dla synchronicznego we/wy. Wszelkie zapisy write na otrzymanym deskryptorze pliku będą blokować proces wołający aż do fizycznego zapisania danych na odpowiednim nośniku. Jednak, zobacz niżej USTERKI.
Jeśli pathname jest dowiązaniem symbolicznym, to otwarcie się nie powiedzie. Jest to rozszerzenie FreeBSD, które zostało dodane do Linuksa w wersji 2.1.126. Nadal będzie się odbywać przechodzenie po dowiązaniach symbolicznych we wcześniejszych składnikach ścieżki. Pliki nagłówkome w glibc 2.0.100 i poźniejszych zawierają definicję tego znacznika. Jądra poprzedzające 2.1.126 zignorują go, jeśli jest używany.
Jeśli pathname nie jest katalogiem, spowoduje, że open zawiedzie. Ten znacznik jest specyficzny dla Linuksa i został do dany w kernelu 2.1.126, aby uniknąć problemów blokowania usług (DoS), gdy opendir(3) jest wywołane dla FIFO lub dla urządzenia taśmowego, ale nie powinno być używane poza implementacją opendir.
Powoduje próbę zminimalizowania efektów związanych z buforowanie we/wy do i z tego pliku. Na ogół spowoduje to zmniejszenie wydajności, ale jest to przydatne w specyficznych sytuacjach, na przykład gdy aplikacje buforują we własnym zakresie. We/wy dla pliku odbywa się wówczas bezpośrednio z/do buforów w przestrzeni użytkownika. We/wy jest sunchromiczne, tzn. po zakończeniu funkcji systemowej read(2) lub write(2) zagwarantowane jest, że dane zostały przeniesione. Wielkości przesyłanych danych, wyrównania buforów w przestrzeni użytkownika oraz pozycje w pliku muszą być wielokrotnościami rozmiaru logicznego bloku systemu plików.
Ten znacznik jest wspierany przez wiele systemów uniksopodobnych; w Linuksie, wsparcie zostało dodane w jądrze wersji 2.4.10.
Semantycznie podobny interfejs dla urządzeń blokowych opisano w raw(8).
Generowanie sygnału (domyślnie SIGIO, ale można go zmienić za pomocą fcntl(2)), gdy wejście lub wyjście poprzez ten deskryptor pliku staje się możliwe. Ta funkcja jest dostępna jedynie dla terminali, pseudoterminali i gniazd. Więcej szczegółów można znaleźć w fcntl(2).
W systemach 32-bitowych, które wspierają obsługę dużych plików (LFS), zezwala na otwieranie plików, których rozmiar nie może być reprezentowany jako liczba 31-bitowa.

Pewne z tych znaczników można zmieniać za pomocą fcntl już po otwarciu pliku.

Argument mode określa prawa, które będą używane do ewentualnego tworzenia nowego pliku. Są one modyfikowane przez umask procesu w zwykły sposób: prawa tworzonego pliku to (mode & ~umask). Należy zauważyć, że te uprawnienia dotyczą jedynie dostępu do nowo utworzonego pliku w przyszłości; wywołanie open, które tworzy plik tylko do obczytu może równie dobrze zwrócić deskryptor pliku do odczytu i zapisu.

Dla parametru mode udostępniono następujące stałe symboliczne:

00700 użytkownik (właściciel pliku) ma prawa odczytu, zapisu i uruchamiania.
00400 użytkownik ma prawa odczytu.
00200 użytkownik ma prawa zapisu.
00100 użytkownik ma prawa uruchamiania.
00070 grupa ma prawa odczytu, zapisu i uruchamiania.
00040 grupa ma prawa odczytu.
00020 grupa ma prawa zapisu.
00010 grupa ma prawa uruchamiania.
00007 inni mają prawa odczytu, zapisu i uruchamiania.
00004 inni mają prawa odczytu.
00002 inni mają prawa zapisu.
00001 inni mają prawa uruchamiania.

mode musi być podane, gdy w flags używany jest znacznik O_CREAT, w przeciwnym wypadku jest ignorowane.

creat jest równoważne open z argumentem flags ustawionym na O_CREAT|O_WRONLY|O_TRUNC.

WARTOŚĆ ZWRACANA

open i creat zwracają nowy deskryptor pliku, lub -1 w wypadku błędu (w tym drugim wypadku ustawiane jest też odpowiednio errno). Należy zauważyć, że open może otwierać pliki urządzeń, lecz creat nie może ich tworzyć. Zamiast niego należy używać mknod(2).

Na systemach NFS z włączonym mapowaniem UID-ów, open może zwrócić deskryptor pliku, dla którego np. żadania read(2) są zabronione przy ustawionym EACCES. Jest to związane sprawdzanie uprawnień odbywa się na kliencie, ale to serwer wykonuje moapowanie UID-ów podczas żądań odczytu i zapisu.

Jeśli plik jest nowoutworzony, to jego pola atime, ctime i mtime są ustawione na czas bieżący i to samo dotyczy pól ctime i mtime katalogu nadrzędnego. Natomiast gdy plik jest modyfikowany z powodu użycia znacznika O_TRUNC, jego pola ctime i mtime są ustawiane na czas bieżący.

BŁĘDY

pathname już istnieje, a użyto O_CREAT i O_EXCL.
pathname odnosi się do katalogu, a żądany był dostęp z prawem zapisu (tzn. ustwine było O_WRONLY lub O_RDWR).
Żądany dostęp do pliku nie jest dozwolony, jeden z katalogów w pathname nie ma praw przeszukiwania (wykonywania), lub plik nie istnieje, a katalog nadrzędny nie ma praw zapisu.
pathname było zbyt długie.
O_CREAT nie było ustawione, a plik o zadanej nazwie nie istnieje. Lub, składnik pathname, który powinien być katalogiem nie istnieje lub jest wiszącym dowiązaniem symbolicznym.
Składnik użyty w pathname jako katalog w rzeczywistości nie jest katalogiem lub podano O_DIRECTORY, a pathname nie było katalogiem.
Podano O_NONBLOCK | O_WRONLY, plik o zadanej nazwie stanowi FIFO i nie jest ono otwarte dla żadnego procesu do odczytu. Lub plik jest plikiem urządzenia specjalnego, a odpowiadające mu urządzenie nie istnieje.
pathname odnosi się do pliku urządzenia specjalnego, a odpowiadające mu urządzenie nie istnieje. (Jest to błąd w jądrze Linuksa - ENXIO powinno być zwracane w takiej sytuacji)
pathname odnosi się do pliku na systemie plików tylko dla odczytu, a żądano otwarcia w trybie zapisu.
pathname odnosi się do wykonywalnego obrazu, który obecnie jest wykonywany, a zażądano dostępu dla zapisu.
pathname wskazuje poza dostępną dla użytkownika przestrzeń adresową.
Podczas rozwiązywania pathname napotkano zbyt wiele dowiązań symbolicznych lub podano O_NOFOLLOW, a pathname jest dowiązaniem symbolicznym.
Gdy pathname miało być utworzone, okazało się, że na urządzeniu na którym miało się znajdować brak miejsca na nowy plik.
Brak dostępnej pamięci jądra.
Proces ma jyż otwartą maksymalną liczbę plików.
Osiągnięto ograniczenie dla łącznej liczby otwartych plików w systemie.

ZGODNE Z

SVr4, SVID, POSIX, X/OPEN, BSD 4.3 Znaczniki O_NOFOLLOW i O_DIRECTORY są specyficzne dla Linuksa. Aby uzyskać ich definicje, należy zdefiniować makro _GNU_SOURCE.

OGRANICZENIA

Jest wiele nieszczęśliwości w protokole podległym NFS, dotykających między innymi O_SYNC i O_NDELAY.

POSIX zapewnia trzy różne warianty synchronicznego we/wy, odpowiadające znacznikom O_SYNC, O_DSYNC i O_RSYNC. Aktualnie (2.1.130) są one pod Linuksem synonimami.

ZOBACZ TAKŻE

read(2), write(2), fcntl(2), close(2), link(2), mknod(2), mount(2), stat(2), umask(2), unlink(2), socket(2), fopen(3), fifo(4)

INFORMACJE O TŁUMACZENIU

Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne. W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:

man --locale=C 2 open

Prosimy o pomoc w aktualizacji stron man - więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages-pl/.

1999-06-03 Linux